-- 开始生成怪物波次
function SpawnWave:start()
	self.startedTime = 0

	-- 定义定时器回调函数
	local function _timerFunc(eventName, actor, data)
		local numMonster = #self.owner.monsters -- 此处的owner,代表的是MonsterManager类的对象
		-- 检查是否达到最大怪物数量或怪物池是否为空
		if numMonster >= self.maxNum or #self.monsters <= 0 then
			return
		end

		-- 计算权重并选择怪物类型
		local weights = {}
		for _, item in ipairs(self.monsters) do
			table.insert(weights, item.data.weight)
		end
		local idx, monsterSpawnData = MathUtils.weightedRandomChoice(self.monsters, weights)
		local range = monsterSpawnData.data.range
		-- 计算本次生成的怪物数量
		-- （最大数量- 当前怪物数量 = 剩余需要生成怪物数量）， maxNumOnce =  单次生成最大数量
		local spawnNum = math.min(self.maxNum - numMonster, MathUtils.randint(1, self.maxNumOnce)) -- 将两个数量比较取最小的返回
		spawnNum = math.min(spawnNum, monsterSpawnData.count) -- 生成数量与每种怪物生成的数量比较，返回最小值
		-- 随机选择一个角色作为生成中心
		local roles = GameAPI.get_all_valid_roles()
		local role = MathUtils.randomChoice(roles)
		local character = role.get_ctrl_unit()
		-- 获取地图边界
		local boundaryXMin = Consts.MAP_BOUNDARY_X[1]
		local boundaryXMax = Consts.MAP_BOUNDARY_X[2]
		local boundaryZMin = Consts.MAP_BOUNDARY_Z[1]
		local boundaryZMax = Consts.MAP_BOUNDARY_Z[2]
		-- 生成怪物
		for _ = 1, spawnNum do
			-- 超出地图外需要重新随机位置
			local maxTryCount = 5
			local pos
			repeat
				pos = MathUtils.randCirclePoint(character.get_position(), range[1], range[2]) -- 在圆环中随机生成随机点
				maxTryCount = maxTryCount - 1
				-- 没有找到合法位置的情况
				if maxTryCount == 0 then -- 尝试五次，都不在合理位置区域内，就退出
					break
				end
			until pos.x > boundaryXMin and pos.x < boundaryXMax and pos.z > boundaryZMin and pos.z < boundaryZMax
			if maxTryCount ~= 0 then -- 尝试机会没有用尽，进入执行
				-- 生成怪物并设置随机朝向
				local yaw = LuaAPI.rand() * math.pi * 2
				self.owner:createMonster( -- 调用MonsterManager类的创建怪物寒素
					monsterSpawnData.data.key, --生成怪物的key
					pos,
					math.Quaternion(0, yaw, 0),
					function(monster, dmgSrc) -- 传入死亡回调函数
						self:onMonsterDie(monster, dmgSrc) -- 处理英雄加经验，从怪物列表中移除，检查是否所有怪物都死亡，是否开始下一波怪物攻击。
					end
				)

				-- 更新怪物数量
				monsterSpawnData.count = monsterSpawnData.count - spawnNum
				if monsterSpawnData.count <= 0 then
					table.remove(self.monsters, idx) -- 该种怪物全部生成后，就移除怪物队列
				end
			end
		end
		self.startedTime = self.startedTime + self.spawnInterval
	end

	-- 先立刻触发一次
	_timerFunc()
	-- 注册定时器事件
	self._spawnTimerId = LuaAPI.global_register_trigger_event({ EVENT.REPEAT_TIMEOUT, self.spawnInterval }, _timerFunc)
end